package com.atguigu.gulimall.order.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.Exchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;

/**
 * @NAME: MyRabbitMQConfig
 * @USER: wjj
 * @DATE: 2023/12/4
 * @TIME: 19:29
 * @DAY_NAME_FULL: 星期一
 * @PROJECT_NAME: gulimall
 */
@Configuration
public class MyRabbitMQConfig {
    //队列
    private static final String QUE_DELAY = "order.delay.queue";
    private static final String QUE_RELEASE = "order.release.order.queue";
    private static final String QUE_SEC = "order.seckill.order.queue";
    private static final String QUE_OTHER = "stock.release.stock.queue";
    //RouKey
    private static final String RK_CREATE = "order.create.order";
    private static final String RK_RELEASE = "order.release.order";
    private static final String RK_SEC = "order.seckill.order";


    //Exchange
    private static final String EX_ORDER = "order-event-exchange";

    /* 容器中的Queue、Exchange、Binding 会自动创建（在RabbitMQ）不存在的情况下
    * 一旦启动@bean配置队列、交换机，即使修改队列，也不会变
    *
    * */

    /**
     * 死信队列
     *
     * @return
     */@Bean
    public Queue orderDelayQueue() {
        /*
            Queue(String name,  队列名字
            boolean durable,  是否持久化
            boolean exclusive,  是否排他
            boolean autoDelete, 是否自动删除
            Map<String, Object> arguments) 属性
         */
        HashMap<String, Object> arguments = new HashMap<>();
        arguments.put("x-dead-letter-exchange", EX_ORDER);
        arguments.put("x-dead-letter-routing-key", RK_RELEASE);
        arguments.put("x-message-ttl", 60000); // 消息过期时间 1分钟
        Queue queue = new Queue(QUE_DELAY, true, false, false, arguments);

        return queue;
    }
    
    /**
     * 普通队列
     *
     * @return
     */
    @Bean
    public Queue orderReleaseQueue() {

        Queue queue = new Queue(QUE_RELEASE, true, false, false);

        return queue;
    }

    /**
     * TopicExchange
     *
     * @return
     */
    @Bean
    public Exchange orderEventExchange() {
        /*
         *   String name,
         *   boolean durable,
         *   boolean autoDelete,
         *   Map<String, Object> arguments
         * */
        return new TopicExchange(EX_ORDER, true, false);

    }


    @Bean
    public Binding orderCreateBinding() {
        /*
         * String destination, 目的地（队列名或者交换机名字）
         * DestinationType destinationType, 目的地类型（Queue、Exhcange）
         * String exchange,
         * String routingKey,
         * Map<String, Object> arguments
         * */
        return new Binding(QUE_DELAY,
                Binding.DestinationType.QUEUE,
                EX_ORDER,
                RK_CREATE,
                null);
    }

    @Bean
    public Binding orderReleaseBinding() {

        return new Binding(QUE_RELEASE,
                Binding.DestinationType.QUEUE,
                EX_ORDER,
                RK_RELEASE,
                null);
    }

    /**
     * 订单释放直接和库存释放进行绑定
     * @return
     */
    @Bean
    public Binding orderReleaseOtherBinding() {

        return new Binding(QUE_OTHER,
                Binding.DestinationType.QUEUE,
                EX_ORDER,
                "order.release.other.#",
                null);
    }


    /**
     * 商品秒杀队列
     * @return
     */
    @Bean
    public Queue orderSecKillOrrderQueue() {
        Queue queue = new Queue(QUE_SEC, true, false, false);
        return queue;
    }

    @Bean
    public Binding orderSecKillOrrderQueueBinding() {
        //String destination, DestinationType destinationType, String exchange, String routingKey,
        // 			Map<String, Object> arguments
        Binding binding = new Binding(
                QUE_SEC,
                Binding.DestinationType.QUEUE,
                EX_ORDER,
                RK_SEC,
                null);

        return binding;
    }


}
